home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / os2 / pccts.zip / TUT3.G < prev    next >
Text File  |  1992-12-08  |  6KB  |  187 lines

  1. #header <<#include "sym.h"
  2.           #include "charbuf.h"
  3.         >>
  4.  
  5. #token "[\t\ ]+"  << zzskip(); >>                /* Ignore White */
  6. #token "\n"       << zzline++; zzskip(); >>
  7. #token STRING     "\"(~[\0-\0x1f\"\\]|(\\~[\0-\0x1f]))*\"" <<;>>
  8.  
  9.  
  10. <<
  11. #define HashTableSize       999
  12. #define StringTableSize     5000
  13. #define GLOBAL              0
  14. #define PARAMETER           1
  15. #define LOCAL               2
  16.  
  17. static Sym *globals = NULL; /* global scope for symbols */
  18. static int current_local_var_offset, LabelNum=0;
  19.  
  20.  
  21. main()
  22. {
  23.     zzs_init(HashTableSize, StringTableSize);
  24.     ANTLR(p(), stdin);
  25. }
  26.  
  27.  
  28. pScope(p)
  29. Sym *p;
  30. {
  31.     for (; p!=NULL; p=p->scope)
  32.     {
  33.         printf("\tlevel %d | %-12s | %-15s\n",
  34.             p->level,
  35.             zztokens[p->token],
  36.             p->symbol);
  37.     }
  38. }
  39. >>
  40.  
  41.  
  42. p       :   <<Sym *p; printf("#include \"sc.h\"\n"); >>
  43.             ( func | "var" def[&globals, GLOBAL] ";" )*
  44.             <<  p = zzs_rmscope(&globals); >>
  45.             "@"
  46.         ;
  47.  
  48.  
  49. def[Sym **scope, int level]
  50.         :   <<Sym *var;>>
  51.             (   WORD
  52.                 <<zzs_scope($scope);
  53.                   var = zzs_newadd($1.text);
  54.                   var->level = $level;
  55.                   var->token = VAR;
  56.                   var->offset = current_local_var_offset++;
  57.                   switch(var->level) {
  58.                         case GLOBAL: printf("SCVAR %s;\n", $1.text); break;
  59.                         case  LOCAL : printf("\tLOCAL;\n"); break;
  60.                   }
  61.                 >>
  62.             |   VAR
  63.                 <<var = zzs_get($1.text);
  64.                   if ( $level != var->level )
  65.                   {
  66.                     zzs_scope($scope);
  67.                     var = zzs_newadd($1.text);
  68.                     var->level = $level;
  69.                     var->token = VAR;
  70.                     var->offset = current_local_var_offset++;
  71.  
  72.                     switch(var-> level) {
  73.                         case GLOBAL: printf("\tSCVAR %s;\n",$1.text);break;
  74.                         case  LOCAL : printf("\tLOCAL;\n"); break;
  75.                     }
  76.                   }
  77.                   else printf("redefined variable ignored: %s\n",$1.text);
  78.                 >>
  79.             )
  80.         ;
  81.  
  82.  
  83. func :  <<Sym *locals=NULL, *var, *p; current_local_var_offset = 0;>>
  84.             WORD
  85.             <<zzs_scope(&globals);
  86.               var = zzs_newadd($1.text);
  87.               var->level = GLOBAL;
  88.               var->token = FUNC;
  89.  
  90.               if (strcmp("main",$1.text)) { printf("%s()\n",$1.text); }
  91.               else printf("_main()\n");
  92.             >>
  93.             "\(" (  def[&locals, PARAMETER]
  94.                  |  <<current_local_var_offset = 1;>>
  95.                  )
  96.             "\)"
  97.             "\{" << printf("{\n\tBEGIN;\n"); >>
  98.                 ( "var" def[&locals, LOCAL] ";" )*
  99.                 ( statement )*
  100.             "\}" << printf("\tEND;\n}\n"); >>
  101.             <<  p = zzs_rmscope(&locals); >>
  102.         ;
  103.  
  104.  
  105. statement : expr ";"            <<printf("\tPOP;\n");>>
  106.         |   "\{" ( statement )* "\}"
  107.         | "if" "\(" expr "\)"   << printf("\tBRF(iflabel%d);\n",LabelNum); >>
  108.                 statement       << printf("iflabel%d: ;\n",LabelNum++);>>
  109.             {"else" statement}
  110.         |
  111.             "while"             << printf("wbegin%d: ;\n", LabelNum); >>
  112.             "\(" expr "\)"      << printf("\tBRF(wend%d);\n",LabelNum); >>
  113.             statement           << printf("\tBR(wbegin%d);\n", LabelNum); >>
  114.                                 << printf("wend%d: ;\n",LabelNum); >>
  115.                                 << LabelNum++; >>
  116.         |   "return" expr ";"   << printf("\tRETURN;\n"); >>
  117.         |   "print" expr ";"    << printf("\tPRINT;\n"); >>
  118.         ;
  119.  
  120.  
  121. expr    :   <<Sym *s;>>
  122.             VAR "=" expr        << printf("\tDUP;\n"); >>
  123.             <<s = zzs_get($1.text);
  124.               if ( s->level != GLOBAL )
  125.                 printf("\tLSTORE(%d);\n", s->offset);
  126.               else printf("\tSTORE(%s);\n", s->symbol);
  127.             >>
  128.         |   expr0
  129.         ;
  130.  
  131. expr0   :   <<char *op;>>
  132.             expr1 ( (   "==" <<op="EQ";>>
  133.                     |   "!=" <<op="NEQ";>>
  134.                     )
  135.                     expr1
  136.                     <<printf("\t%s;\n", op);>>
  137.                   )*
  138.         ;
  139.  
  140.  
  141. expr1   :   <<char *op;>>
  142.             expr2 ( (   "\+" <<op="ADD";>>
  143.                     |   "\-" <<op="SUB";>>
  144.                     )
  145.                     expr2
  146.                     <<printf("\t%s;\n", op);>>
  147.                   )*
  148.         ;
  149.  
  150. expr2   :   <<char *op;>>
  151.             expr3 ( (   "\*" <<op="MUL";>>
  152.                     |   "/"  <<op="DIV";>>
  153.                     )
  154.                     expr3
  155.                     <<printf("\t%s;\n", op);>>
  156.                   )*
  157.         ;
  158.  
  159.  
  160. expr3   :   <<char *op=NULL;>>
  161.             {"\-" <<op="NEG";>>} expr4
  162.             <<if ( op!=NULL ) printf("\t%s;\n", op);>>
  163.         ;
  164.  
  165. expr4   :   <<Sym *s; int arg;>>
  166.             STRING   << printf("\tSPUSH(%s);\n", $1.text); >>
  167.         |   VAR     << s = zzs_get($1.text);
  168.                        if ( s->level != GLOBAL )
  169.                             printf("\tLPUSH(%d);\n", s->offset);
  170.                        else printf("\tPUSH(%s);\n", s->symbol);
  171.                     >>
  172.         |   (   FUNC    <<$0=$1;>>
  173.             |   WORD    <<$0=$1;>>
  174.             )
  175.             "\(" { <<arg=0;>> expr <<arg=1;>> } "\)"
  176.             <<if ( !arg ) printf("\tSPUSH(\"\");\n");
  177.               printf("\tCALL(%s);\n", $1.text);>>
  178.         |   "\(" expr "\)"
  179.     ;
  180.  
  181.  
  182. #token WORD "[a-zA-Z]+"
  183.     <<{
  184.         Sym *p = zzs_get(zzlextext);
  185.         if ( p != NULL ) NLA = p->token;
  186.     }>>
  187.